﻿#ifndef CUSTOMLISTMODEL_H
#define CUSTOMLISTMODEL_H

/**
CustomListModel 是一个继承自 QAbstractListModel 的自定义列表模型类，用于为 Qt 的视图组件（如 QListView）提供数据支持。

这个类实现了标准的 Qt 模型/视图架构中的列表模型，提供了对列表数据的基本 CRUD（创建、读取、更新、删除）操作功能。

1. 基本模型功能
数据访问：通过 data() 方法获取特定索引的数据

行数查询：通过 rowCount() 获取模型中的数据行数

数据修改：通过 setData() 修改指定位置的数据

项标志：通过 flags() 设置项的可编辑、可选中等属性

2. 数据操作功能
插入数据：

提供了多种插入方式的重载函数

可以插入单行或多行数据

支持通过 QVariant 传递任意类型的数据

删除数据：

可以删除单行或多行数据

提供了便捷的 removeItem() 和 clearAll() 方法

批量操作：支持一次插入/删除多行数据

QList<QVariant> m_dataList：存储模型数据的容器，使用 QVariant 可以存储各种类型的数据

-----------------------------------------------

灵活性：使用 QVariant 存储数据，可以支持各种数据类型

完整性：完整实现了模型/视图架构要求的各种通知机制

易用性：提供了多种便捷方法简化常见操作

扩展性：可以轻松继承并扩展更多功能
 */

#include <QAbstractListModel>
#include <QList>
#include <QVariant>

#include "public.h"

class CustomListModel : public QAbstractListModel
{
    Q_OBJECT
public:
    explicit CustomListModel(QObject *parent = nullptr);
    ~CustomListModel();

    /**
     * @brief rowCount 行数
     * @param parent
     * @return
     */
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;

    /**
     * @brief data   获取数据
     * @param index
     * @param role
     * @return
     */
    QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;

    /**
     * @brief setData 设置数据
     * @param index
     * @param value
     * @param role
     * @return
     */
    bool setData(const QModelIndex &index, const QVariant &userData, int role = Qt::EditRole) override;

    /**
     * @brief flags  item状态
     * @param index
     * @return
     */
    Qt::ItemFlags flags(const QModelIndex &index) const override;

    /**
     * @brief insertRows  插入数据
     * @param row
     * @param count
     * @param parent
     * @return
     */
    bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;

    /**
     * @brief insertRows 使用 QVariant 通用参数
     * @param row
     * @param count
     * @param userData
     * @param parent
     * @return
     */
    bool insertRows(int row, int count, const DataItem& userData, const QModelIndex &parent = QModelIndex());

    /**
     * @brief insertRows 插入数据
     * @param row
     * @param userData
     * @param parent
     * @return
     */
    bool insertRows(int row, const DataItem& userData, const QModelIndex &parent = QModelIndex());

    /**
     * @brief addItem 插入数据
     * @param userData
     * @return
     */
    bool addItem(const DataItem& userData);

    /**
     * @brief removeRows 删除指定行
     * @param row
     * @param count
     * @param parent
     * @return
     */
    bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;

    /**
     * @brief removeItem 删除指定行
     * @param row
     * @return
     */
    bool removeItem(int row);

    /**
     * @brief clearAll 清除所有
     * @return
     */
    bool clearAll();
private:
    /**
     * @brief m_dataList 自定义数据
     */
    QList<DataItem> m_dataList;
};

#endif // CUSTOMLISTMODEL_H
